package com.lighting.shortlink.project.mq.producer;

import cn.hutool.core.lang.UUID;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 短链接监控状态保存消息队列生产者
 * @author : lighting
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ShortLinkStatsSaveProducer {

    private final RocketMQTemplate rocketMQTemplate;

    @Value("${rocketmq.producer.topic}")
    private String statsSaveTopic;

    /**
     * 发送延迟消费短链接统计
     * @param producerMap
     */
    public void send(Map<String,String> producerMap)
    {
        String keys = UUID.randomUUID().toString();//生成一个UUID，并将其转换为字符串，用于生成消息的唯一标识符。
        producerMap.put("keys",keys);//将生成的唯一标识符keys添加到消息体producerMap中
        Message<Map<String, String>> build = MessageBuilder // 使用 MessageBuilder创建一个 Message对象
                .withPayload(producerMap)// 设置消息体为 producerMap
                .setHeader(MessageConst.PROPERTY_KEYS, keys)// 设置消息头 MessageConst.PROPERTY_KEYS的值为keys
                .build();// 完成消息的构建
        SendResult sendResult;
//        尝试发送消息，并捕获可能发生的异常
        try {
//            同步发送消息到RocketMQ，超时时间为2000毫秒
             sendResult = rocketMQTemplate.syncSend(statsSaveTopic,build,2000L);
//             记录发送结果的日志信息
            log.info("[消息访问统计监控] 消息发送结果：{}，消息ID：{}，消息Keys：{}", sendResult.getSendStatus(), sendResult.getMsgId(), keys);
        } catch (Throwable ex) {
//            如果发送过程中出现异常，记录错误日志。
            log.error("[消息访问统计监控] 消息放松失败，消息体：{}", JSON.toJSONString(producerMap),ex);
        }
    }

}
